<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <p data-lake-id="uae182da7" id="uae182da7"><br></p>
  <h1 data-lake-id="t6QIw" id="t6QIw"><span data-lake-id="u5966187f" id="u5966187f">典型回答</span></h1>
  <p data-lake-id="u1c01b719" id="u1c01b719"><br></p>
  <p data-lake-id="u27d6444a" id="u27d6444a"><span data-lake-id="ued8f4dd0" id="ued8f4dd0">我们知道，很多Java命令都在jdk的</span><code data-lake-id="u16c2d7f9" id="u16c2d7f9"><span data-lake-id="u18d2bcfa" id="u18d2bcfa">JAVA_HOME/bin/</span></code><span data-lake-id="ub99a7433" id="ub99a7433">目录下面，jps也不例外，他就在bin目录下，所以，他是java自带的一个命令。</span></p>
  <p data-lake-id="u7e56994d" id="u7e56994d"><br></p>
  <p data-lake-id="u91645e4e" id="u91645e4e"><span data-lake-id="uca8bb516" id="uca8bb516">jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个</span><strong><span data-lake-id="u4249aec1" id="u4249aec1">显示当前所有java进程pid</span></strong><span data-lake-id="u98b98658" id="u98b98658">的命令，简单实用，非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。</span></p>
  <p data-lake-id="u20e50518" id="u20e50518"><span data-lake-id="u67ca006b" id="u67ca006b">​</span><br></p>
  <h1 data-lake-id="BJTs6" id="BJTs6"><span data-lake-id="uf8cc1384" id="uf8cc1384">扩展知识</span></h1>
  <p data-lake-id="u2dbe738a" id="u2dbe738a"><br></p>
  <h2 data-lake-id="CTJhG" id="CTJhG"><span data-lake-id="u6255a97a" id="u6255a97a">原理</span></h2>
  <p data-lake-id="ub3481b59" id="ub3481b59"><br></p>
  <p data-lake-id="ucfcb2cd8" id="ucfcb2cd8" style="text-align: justify"><span data-lake-id="u4f908340" id="u4f908340">jdk中的jps命令可以显示当前运行的java进程以及相关参数，它的实现机制如下：</span></p>
  <p data-lake-id="u53947b81" id="u53947b81" style="text-align: justify"><span data-lake-id="u68e4c1a1" id="u68e4c1a1"><br>
    java程序在启动以后，会在java.io.tmpdir指定的目录下，就是临时文件夹里，生成一个类似于hsperfdata_User的文件夹，这个文件夹里（在Linux中为/tmp/hsperfdata_{userName}/），有几个文件，名字就是java进程的pid，因此列出当前运行的java进程，只是把这个目录里的文件名列一下而已。 至于系统的参数什么，就可以解析这几个文件获得。</span></p>
  <p data-lake-id="u6c7536ed" id="u6c7536ed" style="text-align: justify"><span data-lake-id="u69f4a014" id="u69f4a014" class="lake-fontsize-12" style="color: rgb(85, 85, 85)">​</span><br></p>
  <pre lang="java"><code>
hollis@hos:/tmp/hsperfdata_hollis$ pwd
/tmp/hsperfdata_hollis
hollis@hos:/tmp/hsperfdata_hollis$ ll
total 48
drwxr-xr-x 2 hollis hollis  4096  4月 16 10:54 ./
drwxrwxrwt 7 root   root   12288  4月 16 10:56 ../
-rw------- 1 hollis hollis 32768  4月 16 10:57 2679
hollis@hos:/tmp/hsperfdata_hollis$
</code></pre>
  <p data-lake-id="u1bc36aec" id="u1bc36aec"><br></p>
  <p data-lake-id="uabc5774d" id="uabc5774d" style="text-align: justify"><span data-lake-id="ucace4b7d" id="ucace4b7d" class="lake-fontsize-12" style="color: rgb(85, 85, 85)">上面的内容就是我机器中/tmp/hsperfdata_hollis目录下的内容，其中2679就是我机器上当前运行中的java的进程的pid，我们执行jps验证一下：</span></p>
  <p data-lake-id="u86d8a8c4" id="u86d8a8c4" style="text-align: justify"><span data-lake-id="u1ee3ffcf" id="u1ee3ffcf" class="lake-fontsize-12" style="color: rgb(85, 85, 85)">​</span><br></p>
  <pre lang="java"><code>
hollis@hos:/tmp/hsperfdata_hollis$ jps
2679 org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
4445 Jps
</code></pre>
  <p data-lake-id="uef1015ba" id="uef1015ba"><br></p>
  <p data-lake-id="u8de7522b" id="u8de7522b" style="text-align: justify"><span data-lake-id="ue76cbcf5" id="ue76cbcf5" class="lake-fontsize-12" style="color: rgb(85, 85, 85)">执行了jps命令之后，我们发现有两个java进程，一个是pid为2679的eclipse运行的进程，另外一个是pid为4445的jps使用的进程（他也是java命令，也要开一个进程）</span></p>
  <p data-lake-id="u54c3e26f" id="u54c3e26f" style="text-align: justify"><span data-lake-id="u4576e11f" id="u4576e11f" class="lake-fontsize-12" style="color: rgb(85, 85, 85)">​</span><br></p>
  <h2 data-lake-id="bcxin" id="bcxin"><span data-lake-id="ucc224abd" id="ucc224abd" style="color: rgb(85, 85, 85)">使用</span></h2>
  <p data-lake-id="u5d8f830d" id="u5d8f830d"><br></p>
  <p data-lake-id="ubf594eb9" id="ubf594eb9"><span data-lake-id="u159960eb" id="u159960eb">想要学习一个命令，先来看看帮助，使用jps -help查看帮助：</span></p>
  <p data-lake-id="u3eaa0337" id="u3eaa0337"><span data-lake-id="u9ed4bcad" id="u9ed4bcad">​</span><br></p>
  <pre lang="java"><code>
hollis@hos:/tmp/hsperfdata_hollis$ jps -help
usage: jps [-help]
       jps [-q] [-mlvV] [&lt;hostid&gt;]

Definitions:
    &lt;hostid&gt;:      &lt;hostname&gt;[:&lt;port&gt;]
</code></pre>
  <p data-lake-id="u6125c69e" id="u6125c69e"><br></p>
  <p data-lake-id="ub6e7c56d" id="ub6e7c56d"><span data-lake-id="ue1a4a8a0" id="ue1a4a8a0">接下来，为了详细介绍这些参数，我们编写几个类，在main方法里写一个while(true)的循环，查看java进程情况。代码如下：</span></p>
  <pre lang="java"><code>
package com.JavaCommand;
/**
 * @author hollis
 */
public class JpsDemo {
    public static void main(String[] args) {
        while(true){
            System.out.println(1);
        }
    }
}
</code></pre>
  <p data-lake-id="ub0946d71" id="ub0946d71"><span data-lake-id="u11b1b08b" id="u11b1b08b">​</span><br></p>
  <p data-lake-id="uf7113d84" id="uf7113d84"><span data-lake-id="uf8537456" id="uf8537456">-q 只显示pid，不显示class名称,jar文件名和传递给main 方法的参数</span></p>
  <pre lang="java"><code>
hollis@hos:/tmp/hsperfdata_hollis$ jps -q
2679
11421
</code></pre>
  <p data-lake-id="u7e0fb292" id="u7e0fb292"><span data-lake-id="u6271888e" id="u6271888e">​</span><br></p>
  <p data-lake-id="uf476c668" id="uf476c668"><span data-lake-id="u5a2b3f7d" id="u5a2b3f7d">-m 输出传递给main 方法的参数，在嵌入式jvm上可能是null， 在这里，在启动main方法的时候，我给String[] args传递两个参数。hollis,chuang,执行jsp -m:</span></p>
  <pre lang="java"><code>
hollis@hos:/tmp/hsperfdata_hollis$ jps -m
12062 JpsDemo hollis,chuang
</code></pre>
  <p data-lake-id="u5a722213" id="u5a722213"><span data-lake-id="u1d954149" id="u1d954149">​</span><br></p>
  <p data-lake-id="uef916ccb" id="uef916ccb"><span data-lake-id="u44de91fa" id="u44de91fa">-l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名</span></p>
  <pre lang="java"><code>
hollis@hos:/tmp/hsperfdata_hollis$ jps -l
12356 sun.tools.jps.Jps
2679 /home/hollis/tools/eclipse//plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
12329 com.JavaCommand.JpsDemo
</code></pre>
  <p data-lake-id="uacc4cad7" id="uacc4cad7"><span data-lake-id="u6052851b" id="u6052851b">​</span><br></p>
  <p data-lake-id="uab55046f" id="uab55046f"><span data-lake-id="uf8a34e3e" id="uf8a34e3e">-v 输出传递给JVM的参数 在这里，在启动main方法的时候，我给jvm传递一个参数：-Dfile.encoding=UTF-8,执行jps -v：</span></p>
  <pre lang="java"><code>
hollis@hos:/tmp/hsperfdata_hollis$ jps -v
2679 org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar -Djava.library.path=/usr/lib/jni:/usr/lib/x86_64-linux-gnu/jni -Dosgi.requiredJavaVersion=1.6 -XX:MaxPermSize=256m -Xms40m -Xmx512m
13157 Jps -Denv.class.path=/home/hollis/tools/java/jdk1.7.0_71/lib:/home/hollis/tools/java/jdk1.7.0_71/jre/lib: -Dapplication.home=/home/hollis/tools/java/jdk1.7.0_71 -Xms8m
13083 JpsDemo -Dfile.encoding=UTF-8
</code></pre>
  <p data-lake-id="u728ef809" id="u728ef809"><span data-lake-id="u99a7a507" id="u99a7a507">​</span><br></p>
  <p data-lake-id="u2e9c150f" id="u2e9c150f"><span data-lake-id="u55eff944" id="u55eff944">PS:jps命令有个地方很不好，似乎只能显示当前用户的java进程，要显示其他用户的还是只能用unix/linux的ps命令。</span></p>
  <p data-lake-id="u51814079" id="u51814079"><span data-lake-id="uc246111f" id="uc246111f">​</span><br></p>
  <p data-lake-id="ue8d13b92" id="ue8d13b92"><span data-lake-id="ub6c92bd1" id="ub6c92bd1">​</span><br></p>
 </body>
</html>